﻿#include <iostream>
using namespace std;
/*类行为型模式
1.意图
定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义
该算法的某些特定步骤
2.适用性
模板方法应用于下列情况：
a.一次性实现一个算法的不变的部分，并将可变的行为留给子类来实现
b.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处，并将不同之处分离为
新的操作。最后，用一个调用这些新的操作的模板方法来替换这些不同的代码
c.控制子类扩展。模板方法只在特定点调用“hook”操作，这样就只允许在这些点进行扩展。
*/

class ComputerObject
{
public:
	virtual void BuyBoard() = 0;
	virtual void BuyDisplay() = 0;
	virtual void BuyKeyboard() = 0;
	void MakeComputer()
	{
		BuyBoard();
		BuyDisplay();
		BuyKeyboard();
	}
};

class BrandComputer:public ComputerObject
{
public:
	void BuyBoard()
	{
		cout << "某品牌主板 ";
	}
	void BuyDisplay()
	{
		cout << "同一品牌显示器 ";
	}
	void BuyKeyboard()
	{
		cout << "同一品牌键盘" << endl;
	}
};

class PersonComputer :public ComputerObject
{
public:
	void BuyBoard()
	{
		cout << "A品牌主板 ";
	}
	void BuyDisplay()
	{
		cout << "B品牌显示器 ";
	}
	void BuyKeyboard()
	{
		cout << "C品牌键盘" << endl;
	}
};
int main()
{
	ComputerObject* cObject = new BrandComputer;
	cObject->MakeComputer();
	delete cObject;
	cObject = new PersonComputer;
	cObject->MakeComputer();
	delete cObject;
	return 0;
}